// Returns 0 on error (out of memory)
static int
-set_p2m_entry(struct domain *d, unsigned long gfn, mfn_t mfn, u32 l1e_flags)
+set_p2m_entry(struct domain *d, unsigned long gfn, mfn_t mfn, p2m_type_t p2mt)
{
// XXX -- this might be able to be faster iff current->domain == d
mfn_t table_mfn = pagetable_get_mfn(d->arch.phys_table);
d->arch.p2m.max_mapped_pfn = gfn;
if ( mfn_valid(mfn) )
- entry_content = l1e_from_pfn(mfn_x(mfn), l1e_flags);
+ entry_content = l1e_from_pfn(mfn_x(mfn), p2m_type_to_flags(p2mt));
else
entry_content = l1e_empty();
P2M_PRINTK("populating p2m table\n");
/* Initialise physmap tables for slot zero. Other code assumes this. */
- gfn = 0;
- mfn = _mfn(INVALID_MFN);
- if ( !set_p2m_entry(d, gfn, mfn, __PAGE_HYPERVISOR|_PAGE_USER) )
+ if ( !set_p2m_entry(d, 0, _mfn(INVALID_MFN), p2m_invalid) )
goto error;
+ /* Copy all existing mappings from the page list and m2p */
for ( entry = d->page_list.next;
entry != &d->page_list;
entry = entry->next )
(gfn != 0x55555555L)
#endif
&& gfn != INVALID_M2P_ENTRY
- && !set_p2m_entry(d, gfn, mfn, __PAGE_HYPERVISOR|_PAGE_USER) )
+ && !set_p2m_entry(d, gfn, mfn, p2m_ram_rw) )
goto error;
}
return;
P2M_DEBUG("removing gfn=%#lx mfn=%#lx\n", gfn, mfn);
- set_p2m_entry(d, gfn, _mfn(INVALID_MFN), 0);
+ set_p2m_entry(d, gfn, _mfn(INVALID_MFN), p2m_invalid);
set_gpfn_from_mfn(mfn, INVALID_M2P_ENTRY);
}
if ( mfn_valid(_mfn(mfn)) )
{
- set_p2m_entry(d, gfn, _mfn(mfn), p2m_type_to_flags(t));
+ set_p2m_entry(d, gfn, _mfn(mfn), t);
set_gpfn_from_mfn(mfn, gfn);
}
else
{
gdprintk(XENLOG_WARNING, "Adding bad mfn to p2m map (%#lx -> %#lx)\n",
gfn, mfn);
- set_p2m_entry(d, gfn, _mfn(INVALID_MFN), 0);
+ set_p2m_entry(d, gfn, _mfn(INVALID_MFN), p2m_invalid);
}
audit_p2m(d);
mfn = gfn_to_mfn(d, gfn, &pt);
if ( pt == ot )
- set_p2m_entry(d, gfn, mfn, p2m_type_to_flags(nt));
+ set_p2m_entry(d, gfn, mfn, nt);
p2m_unlock(d);